import createDOMElement from './createDOMElement'
import mountElement from './mountElement'
import updateNodeElement from './updateNodeElement'
import updateTextNode from './updateTextNode'
import unmountNode from './unmountNode'

export default function diff (virtualDOM, container, oldDOM){
    const oldVirtualDOM = oldDOM && oldDOM._virtualDOM
    // 判断oldDOM是否存在
    if(!oldDOM) {
        mountElement(virtualDOM, container)

        // 节点类型不想等 并且需要把 virtualDOM 是组件的情况排除
    } else if (virtualDOM.type !== oldVirtualDOM.type && typeof virtualDOM.type !== 'function'){
        // 不相等的情况下不需要比对，直接生成新的dom并替换
        const newElement = createDOMElement(virtualDOM)
        oldDOM.parentNode.replaceChild(newElement, oldDOM)
    } else if(oldVirtualDOM && virtualDOM.type === oldVirtualDOM.type) {
        if(virtualDOM.type == 'text'){  
            // 更新内容
            updateTextNode(virtualDOM, oldVirtualDOM, oldDOM)
        } else {
            // 更新元素属性
            updateNodeElement(oldDOM,virtualDOM,oldVirtualDOM)
        }


        virtualDOM.children.forEach((child, i) => {
            diff(child, oldDOM, oldDOM.childNodes[i])
        })

        // 删除节点
        // 获取旧节点
        let oldChildNodes = oldDOM.childNodes
        // 判断旧节点数量
        if(oldChildNodes.length > virtualDOM.children.length) {
            // 有节点需要被删除
            for (let i = oldChildNodes.length - 1; i > virtualDOM.children.length - 1; i--) {
                unmountNode(oldChildNodes[i])
            }
        }
    } else if (typeof virtualDOM.type === 'function'){
        
    }
}